perm filename NSCTPY.F4[OLD,LCS]1 blob
sn#104347 filedate 1974-05-25 generic text, type T, neo UTF8
00100 C ***** NSCTPY JUL 16 71 ****** WRITES ON MAGTAPE OR DSK. NO SCOPE!
00200 C ****** LOAD WITH TAPOUT.REL *********
00300 C TO WRITE ON DSK: BIGBIT←1; OR RCDFLG←1; TO WRITE ON TAPE: BIGBIT←-1;
00400 C BIGBIT←>1; WRITES ON DSK, 4TH LETTER OF NAME IS SET BY NUMBER.
00500 C IF RCDFLG IS NOT 0 OR 1, ONE LONG FILE IS WRITTEN. PLAY WITH 'PLAY'.
00600 SUBROUTINE SMPLS(LSBUF,ISBCNT,IBOTT,MAXAMP,BIGBIT,RCDFLG)
00700 COMMON JSB(10)
00800 DIMENSION MX(3),INM(3),MZ(4),IBOTT(1),MQ(5)
00900 EQUIVALENCE (JSB(3),JSB3),(JSB(4),JSB4),(JSB(5),JSB5)
01000 DATA (MX(JSC),JSC=1,2)/'AMPL.=0 /'/,INM(2)/' AMP='/
01100 DATA (MZ(K),K=1,3)/'ADJUST LSBUF!**'/
01200 DATA JSAVE/33000/
01300 IF(J)GO TO 6
01400 86 K=-1
01500 IEND=-1
01600 LNM=0
01700 NUM=0
01800 IMAX=50000
01900 IF(BIGBIT.EQ.0)GO TO 8
02000 IF(RCDFLG.GT.8000)JSAVE=RCDFLG
02100 RCDFLG=0
02200 C WILL SAVE AFTER C.33K UNLESS RCDFLG>8K
02300 87 IF(BIGBIT.LT.0)GO TO 88
02400 IF(BIGBIT.LT.1)GO TO 8
02500 JSC=BIGBIT-1.
02600 LNM='MUSAA'+256*JSC
02700 BIGBIT=.5
02800 C NAME CHANGE ONLY WORKS WHEN WRITING ON DSK.
02900 J=0
03000 GO TO 87
03100 88 K=0
03200 CC CALL MESS(MZ)
03300 KBIT=2
03400 GO TO 9
03500 8 KBIT=3.-BIGBIT
03600 IF(RCDFLG.GT.1.)RCDFLG=-1.
03700 9 IF(RCDFLG.NE.-1)IBOTT(1024)=0
03800 JSB(2)=KBIT
03900 C KBIT=3, 12-BITS. KBIT=2, 18-BITS. JSB(2) PASSES KBIT TO CONVRT.
04000 IF(J.EQ.1)GO TO 5
04100 JNM='MUSAA'
04200 IF(LNM.NE.0)JNM=LNM
04300 1 INM(1)=JNM
04400 KNM=JNM
04500 J=1
04600 5 IF(INM(1).LE.JNM+50)GO TO 2
04700 JNM=JNM+256
04800 IF(JNM.LE.KNM+6400)GO TO 3
04900 KNM=JNM+26112
05000 JNM=KNM
05100 C RAISES 'AAAZA' TO 'AABAA'
05200 3 INM(1)=JNM
05300 C NAMES GO FROM 'AAAAA' TO 'AAZZZ': MUSAA,MUSAB,MUSAC,ETC.
05400 2 IF(K)GO TO 33
05500 CALL GETTAP
05600 GO TO 34
05700 33 CALL PUTFIL(INM(1))
05800 34 J=-1
05900 JSC=LSBUF
06000 C IF RCDFLG←-1; LSBUF=1024 -- OTHERWISE LSBUF=1023 AND LAST WD(1024) IS AMP.
06100 IF(RCDFLG)GO TO 666
06200 JSC=LSBUF+1
06300 C WRITES LSBUF+1 WDS. THE '+1' WILL HAVE MAXAMP IN LAST BUFFER.
06400 JSB(1)=JSC
06500 JSB3=INM(1)
06600 JSB4=9999
06700 JSB5=9998
06800 IF(K)GO TO 66
06900 CALL TOTAPE(JSB(1),128)
07000 GO TO 6
07100 C666 JSC=1024
07200 666 IMAX=2050
07300 GO TO 6
07400 66 CALL FASTOU(JSB(1),128)
07500 6 IF(ISBCNT.NE.0)GO TO 7
07600 IF(NUM+LSBUF.LT.JSAVE.OR.RCDFLG)GO TO 4
07700 10 IBOTT(JSC)=MAXAMP
07800 IF(MAXAMP.EQ.0)IBOTT(JSC)=1
07900 C IF 0, THEN NO WAY TO FIND END OF FILE IN OTHER PROGS.
08000 5444 IEND=0
08100 GO TO 4
08200 7 IF(RCDFLG)GO TO 5444
08300 IBOTT(LSBUF)=(ISBCNT-1)/KBIT
08400 MAXAMP=-MAXAMP
08500 C LAST WRD OF LSBUF IS USED FOR WDCNT OF FREE SPACE IN LAST BUFFER.
08600 C -MAXAMP TELLS CONVRT IT'S THE LAST BUFFER.
08700 GO TO 10
08800 4 NUM=NUM+LSBUF
08900 IF(MAXAMP.EQ.0)CALL MESS(MX)
09000 CC GO TO 4444
09100 IF(MAXAMP.LT.IMAX)GO TO 4444
09200 C IABS(MAXAMP) WON'T WORK 1ST TIME AROUND!!!!!!!⊗⊗⊗⊗⊗⊗⊗⊗⊗⊗⊗
09300 C 49999 IS MAXIMUM AMPL. POSSIBLE (ARBITRARY NUMBER.)
09400 CALL MESS(INM)
09500 CALL MESS(INM)
09600 CALL MESS(INM)
09700 CALL MESS(INM)
09800 CALL PNUM(MAXAMP)
09900 GO TO 227
10000 4444 IF(K)GO TO 44
10100 CALL TOTAPE(IBOTT(1),JSC)
10200 GO TO 45
10300 44 CALL FASTOU(IBOTT(1),JSC)
10400 45 IF(IEND)RETURN
10500 IF(RCDFLG)GO TO 224
10600 22 JSB(1)=-1
10700 JSB3=INM(1)
10800 JSB4=9999
10900 JSB5=9998
11000 IF(K)GO TO 222
11100 CALL TOTAPE(JSB(1),128)
11200 C '-1' MARKS END OF THIS BATCH OF DATA.
11300 C '9999' IDENTIFIES IT AS MUSIC DATA WHEN TAPE IS READ.
11400 CALL FINTAP
11500 CALL BACKSP
11600 CALL BACKSP
11700 GO TO 223
11800 224 K=NUM/LSBUF
11900 J=0
12000 NUM=4-K-(K/4*4)
12100 C MAKES MULTIPLES OF 4K.
12200 J=0
12300 CC IF(NUM.EQ.0)GO TO 2221
12400 2251 DO 225 K=1,1024
12500 225 IBOTT(K)=0
12600 2261 DO 226 K=1,NUM
12700 226 CALL FASTOU(IBOTT(1),LSBUF)
12800 227 CALL FINFIL
12900 GO TO 2221
13000 222 CALL FASTOU(JSB(1),128)
13100 CALL FINFIL
13200 223 J=1
13300 2231 IF(RCDFLG.GE.0)CALL SAVER
13400 JSB(1)=0
13500 2221 CALL MESS(INM)
13600 CALL PNUM(MAXAMP)
13700 INM(1)=INM(1)+2
13800 RETURN
13900 END
14000
14100
14200 C ********** SEG -- *********
14300
14400 SUBROUTINE SEG(FUNC)
14500 C TYPE AMPL, STEP# (UP TO STEP 512). ---- SAME FORMAT AS GEN 1 IN MUSIC5.
14600 DIMENSION FUNC(512),A(4)
14700 COMMON K,STEP,AMP1,AMP2,DIF,IT,IS,ST,STPS,RK
14800 DATA (A(K),K=1,3)/'SEG ARRAY FULL/'/
14900 AMP1=0
15000 ST=0
15100 1 CALL RDNUM(AMP2)
15200 CALL RDNUM(STEP)
15300 IF(STEP.GT.1.)GO TO 3
15400 AMP1=AMP2
15500 GO TO 1
15600 C STEP=1 AND STEP=0 ARE CONSIDERED THE SAME.
15700 3 DIF=AMP2-AMP1
15800 5 IT=ST
15900 IS=STEP*5.120+.0001
16000 STEP=IS
16100 STPS=STEP-ST
16200 IS=STPS
16300 IF(IS+IT.GT.512)GO TO 6
16400 ST=STEP
16500 IF(ST.EQ.0)STEP=1.
16600 DO 2 K=1,IS
16700 CC M=K+IT
16800 RK=K
16900 2 FUNC(K+IT)=AMP1+DIF*RK/STPS
17000 AMP1=AMP2
17100 ST=STEP
17200 CC CALL PNUM(M)
17300 IF(STEP.LT.512)GO TO 1
17400 CC IF(STEP.GT.513.)GO TO 6
17500 1102 CALL MESS(A)
17600 CC*** WHY WAS THIS HERE???? FUNC(1)=0.0
17700 RETURN
17800 6 K=1
17900 8 CALL RDNUM(RK)
18000 7 FUNC(K)=RK
18100 K=K+1
18200 IF(K.LE.512)GO TO 8
18300 GO TO 1102
18400 END
18500
18600 SUBROUTINE SYNTH (FUNC)
18700 C AFTER 'SYNTH(F1);' TYPE 99= TO USE H,A,P,K: ALL OTHER
18800 C NUMBERS = H,A ONLY. TYPE 999 TO END. NORMALIZATION IS AUTOMATIC.
18900 DIMENSION FUNC(512),F(5)
19000 COMMON I,XX,X,H,K,CON,XK,FAC,AMP,Y
19100 DATA (F(I),I=1,4)/'SYNTH ARRAY FULL/'/
19200 DO 15 I=1,512
19300 15 FUNC(I)=0.0
19400 CALL RDNUM(XX)
19500 IF(XX.EQ.99)XX=-99
19600 FAC=360./512.
19700 H=XX
19800 IF(XX)CALL RDNUM(H)
19900 16 CALL RDNUM(AMP)
20000 IF(XX)GO TO 1016
20100 X=0
20200 CON=0
20300 GO TO 2016
20400 1016 CALL RDNUM(X)
20500 X=X*512./360.+1.0
20600 CALL RDNUM(CON)
20700 2016 DO 17 J=1,512
20800 XK=SIND(X*FAC)*AMP+CON
20900 IF(CON.LT.100.0)GO TO 1
21000 FUNC(J)=(XK-100.)*FUNC(J)
21100 GO TO 2
21200 1 FUNC(J)=FUNC(J)+XK
21300 2 X=X+H
21400 IF(X.LE.512.)GO TO 17
21500 X=X-512.
21600 17 CONTINUE
21700 CALL RDNUM(H)
21800 IF(H.NE.999.)GO TO 16
21900 2200 X=FUNC(1)
22000 DO 19 I=2,512
22100 H=ABS(FUNC(I))
22200 19 IF(X.LT.H)X=H
22300 DO 20 I=1,512
22400 20 FUNC(I)=FUNC(I)/X
22500 CALL MESS(F)
22600 RETURN
22700 END
22800 C *********** DUR2 1969 *********
22900 FUNCTION DUR(P2,SPEED,CHNS)
23000 COMMON P,ISR,NC,IDUR,ID,IP(5)
23100 DATA IP/20000,25000,10000,50000,100000/
23200 P=P2
23300 ISPD=SPEED
23400 NC=CHNS*30+.3
23500 3 IDUR=P*10000+.5
23600 5 IDUR=(IDUR*IP(ISPD))/1000
23700 6 ID=IDUR/NC
23800 7 ID=IDUR-ID*NC
23900 IF(ID.EQ.0)GO TO 1
24000 P=P+.0001
24100 GO TO 3
24200 1 DUR=P
24300 RETURN
24400 END
24500
24600
24700 SUBROUTINE SEE(FUNC)
24800
24900 DIMENSION FUNC(512),SU(150),C(3)
25000 DATA (C(I),I=1,2)/'0=CLEAR: '/
25100 CC CALL DDCLR
25200 C THIS VERSION MUST BE LOADED WITH %LTVRLIB (FOR 'DDCLR')
25300 CC CALL TYPLOC(-300,-512)
25400 CALL DPYSET(2,SU,150)
25500 CC CALL DPYBRT(6)
25600 CALL ALINE(-264,0,256,0)
25700 CALL ALINE(-256,-256,-256,256)
25800 CALL AIVECT(0,0)
25900 1 IY=FUNC(1)*256.0
26000 CALL AIVECT(-256,IY)
26100 DO 14 I=2,512,3
26200 IY2=FUNC(I)*256.0
26300 CALL RVECT(3,IY2-IY)
26400 14 IY=IY2
26500 CALL DPYOUT(2)
26600 100 CALL MESS(C)
26700 1100 CALL RDNUM(X)
26800 CALL DPYCLR
26900 RETURN
27000 END
27100
27200 FUNCTION POWER(X,Y)
27300 POWER=EXP(Y*ALOG(X))
27400 RETURN
27500 END